home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 4
/
Amiga Tools 4.iso
/
tools
/
disk-tools
/
cd-rom
/
audio
/
jukebox
/
jukebox-extensions
/
source
/
prog-gui.c
< prev
Wrap
C/C++ Source or Header
|
1996-02-26
|
11KB
|
482 lines
/* JB-Prog-Gui -- macht die JukeBox programmierbar */
/* INCLUDE */
#include <exec/lists.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <clib/alib_protos.h>
#if defined(_DCC)
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#else
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/gadtools.h>
#include <proto/exec.h>
#include <proto/dos.h>
#endif
#include <string.h>
/* P R O T O T Y P E N */
void WriteNumsToFile(void);
struct Node *FindNodeNum(struct List *,UWORD);
void ChangeRightGadget(void);
void AddNodeRight(UWORD);
void RemNodeRight(UWORD);
void AdjustGadgets(void);
int MakeGadgets(void);
void RemoveGadgets(void);
int MakeList(void);
struct Node *MakeNode(char *);
void ShowMsg(STRPTR);
#define POOLSIZE 4096
#define TRESHSIZE 1024
#define DEFAULTIN "t:jb.toc"
#define DEFAULTOUT "t:jb.tracks"
#define DEFAULTLEFT "Inhalt"
#define DEFAULTRIGHT "gewählt"
#define NOMEM "Zuwenig Speicher!"
/* Globale Variablen und Strukturen */
const char VERSION[]="$VER: Prog-GUI V2.00 by P. Kursawe 1996";
/* libnix specials */
int __nocommandline = 1;
int __initlibraries = 1;
struct TagItem gg1tags[]={GTLV_Labels,0,TAG_DONE,0};
struct TagItem gg2tags[]={GTLV_Labels,0,GTLV_Top,0,TAG_DONE,0};
struct GfxBase *GfxBase = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct Library *GadToolsBase=NULL;
struct DosLibrary *DOSBase= NULL;
struct Gadget *gg1ptr = NULL;
struct Gadget *gg2ptr = NULL;
struct Gadget *glistptr = NULL;
struct Gadget *context = NULL;
struct VisualInfo *vi = NULL;
struct Gadget *dummygg = NULL;
struct Window *mywindow = NULL;
struct MinList Header1;
struct MinList Header2;
struct RDArgs *rdargs = NULL;
LONG Kommandoparameter[] = {
(ULONG)DEFAULTIN,
(ULONG)DEFAULTOUT,
(ULONG)DEFAULTLEFT,
(ULONG)DEFAULTRIGHT};
APTR mempool;
int FontHeight;
struct TextAttr normalfont;
struct NewGadget gadget1=
{
5,15,200,150,NULL,&normalfont,1,PLACETEXT_BELOW,0,0
};
struct NewGadget gadget2=
{
210,15,200,150,NULL,&normalfont,2,PLACETEXT_BELOW,0,0
};
int main()
{
static struct TagItem wintags[]=
{
WA_Flags,WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_ACTIVATE,
WA_Left,0,
WA_Top,15,
WA_MinWidth,200,
WA_MinHeight,70,
WA_MaxWidth,-1,
WA_MaxHeight,-1,
WA_Title,(ULONG)"JukeBox Programming Function",
WA_Width,640,
WA_Height,184,
WA_IDCMP,IDCMP_CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_NEWSIZE,
TAG_DONE,0
};
struct IntuiMessage *imsg;
struct Gadget *address;
ULONG imClass;
UWORD imCode;
if((mempool=LibCreatePool(MEMF_CLEAR,POOLSIZE,TRESHSIZE)) == NULL)
return;
NewList((struct List *)&Header1);
gg1tags[0].ti_Data=((ULONG)&Header1);
NewList((struct List *)&Header2);
gg2tags[0].ti_Data=((ULONG)&Header2);
if((DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",37L)))
{
if((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L)))
{
if((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37L)))
{
if((GadToolsBase=OpenLibrary("gadtools.library",37L)))
{
/* hier sind alle Libraries offen */
rdargs=ReadArgs((STRPTR)"IN,OUT,LEFTTEXT,RIGHTTEXT",Kommandoparameter,NULL);
gadget1.ng_GadgetText=(UBYTE *)Kommandoparameter[2];
gadget2.ng_GadgetText=(UBYTE *)Kommandoparameter[3];
if((mywindow=OpenWindowTagList(NULL,wintags)))
{
/* Verzweifelter Versuch, den richtigen Font zu nehmen */
FontHeight = mywindow->IFont->tf_YSize;
normalfont.ta_YSize = FontHeight;
normalfont.ta_Name = mywindow->IFont->tf_Message.mn_Node.ln_Name;
normalfont.ta_Style = mywindow->IFont->tf_Style;
normalfont.ta_Flags = mywindow->IFont->tf_Flags;
/* daran ändert sich nix... */
gadget1.ng_LeftEdge = mywindow->BorderLeft+5;
gadget1.ng_TopEdge = mywindow->BorderTop+5;
gadget2.ng_TopEdge = gadget1.ng_TopEdge;
AdjustGadgets();
if((MakeList()))
{
if((MakeGadgets()))
{
for(;;)
{
if(Wait(1L<<mywindow->UserPort->mp_SigBit|SIGBREAKF_CTRL_C)&SIGBREAKF_CTRL_C)
break;
while((imsg=GT_GetIMsg(mywindow->UserPort)) != NULL)
{
imClass = imsg->Class;
imCode = imsg->Code;
address = imsg->IAddress;
GT_ReplyIMsg(imsg);
switch(imClass)
{
case IDCMP_CLOSEWINDOW:
goto ende;
case IDCMP_GADGETUP:
if(address->GadgetID==1)
{
AddNodeRight(imCode);
break;
}
if(address->GadgetID==2)
{
RemNodeRight(imCode);
break;
}
case IDCMP_NEWSIZE:
RemoveGadgets();
AdjustGadgets();
MakeGadgets();
default:
break;
}
}
}
ende:
RemoveGadgets();
WriteNumsToFile();
}
else
{
ShowMsg("Konnte Gadgets nicht anlegen!\n");
}
}
else
{
ShowMsg("Konnte Listen nicht erstellen!\n");
}
CloseWindow(mywindow);
}
FreeArgs(rdargs);
/* alle Libraries schließen */
CloseLibrary(GadToolsBase);
}
else
{
ShowMsg("Kann gadtools.library nicht öffnen!\n");
}
CloseLibrary((struct Library *)IntuitionBase);
}
else
{
ShowMsg("Kann intuition.library nicht öffnen!\n");
}
CloseLibrary((struct Library *)GfxBase);
}
else
{
ShowMsg("Kann graphics.library nicht öffnen!\n");
}
CloseLibrary((struct Library *)DOSBase);
}
LibDeletePool(mempool);
return 0;
}
/* -------------------------------------- */
/* UNTERROUTINEN */
/* -------------------------------------- */
void WriteNumsToFile(void)
{
BPTR filehandle = NULL;
char fmt[] = "%u\n";
struct Node *node;
UWORD args[]={0};
if((filehandle = Open((char *)Kommandoparameter[1],MODE_NEWFILE)))
{
node = (struct Node *)Header2.mlh_Head;
while(node != (struct Node *)&Header2.mlh_Tail)
{
args[0] = node->ln_Type;
VFPrintf(filehandle,fmt,args);
node = node->ln_Succ;
}
Close(filehandle);
}
else
{
ShowMsg("Kann \"");
ShowMsg((char *)Kommandoparameter[1]);
ShowMsg("\"nicht öffnen!\n");
}
}
struct Node *FindNodeNum(struct List * liste,UWORD Zahl)
{
struct Node * foundnode = NULL;
UWORD i;
if (IsListEmpty(liste))
return(foundnode);
foundnode = liste->lh_Head;
for(i=0; i<Zahl;i++)
{
if(foundnode->ln_Succ == NULL)
break;
foundnode = foundnode->ln_Succ;
}
return(foundnode);
}
void AddNodeRight(UWORD Punkt) /* Fügt eine Node (nummer x) ins rechte Gadget ein */
{
UBYTE tmpnum;
struct Node * nodetoclone = NULL;
if((nodetoclone = FindNodeNum((struct List *)&Header1,Punkt)))
{
tmpnum = nodetoclone->ln_Type;
nodetoclone = MakeNode(nodetoclone->ln_Name);
if((nodetoclone))
{
nodetoclone->ln_Type = tmpnum;
gg2tags[0].ti_Data=0L;
ChangeRightGadget();
AddTail((struct List *)&Header2,nodetoclone);
gg2tags[1].ti_Data++;
gg2tags[0].ti_Data=(ULONG)&Header2;
ChangeRightGadget();
}
}
}
void RemNodeRight(UWORD Punkt)
{
struct Node * nodetoremove = NULL;
if((nodetoremove = FindNodeNum((struct List *)&Header2,Punkt)))
{
gg2tags[0].ti_Data=0L;
ChangeRightGadget();
Remove(nodetoremove);
gg2tags[1].ti_Data--;
gg2tags[0].ti_Data=(ULONG)&Header2;
ChangeRightGadget();
LibFreePooled(mempool,nodetoremove,sizeof(struct Node)+strlen(nodetoremove->ln_Name)+1);
}
}
void ChangeRightGadget(void)
{
GT_SetGadgetAttrsA(gg2ptr,mywindow,NULL,gg2tags);
}
void AdjustGadgets(void)
{
gadget1.ng_Height = mywindow->Height - mywindow->BorderBottom - FontHeight - 3 - gadget1.ng_TopEdge;
if(gadget1.ng_Height < 5)
{
gadget1.ng_Height = 5;
}
gadget2.ng_Height = gadget1.ng_Height;
gadget1.ng_Width = ( (mywindow->Width - mywindow->BorderLeft - mywindow-> BorderRight - 15) / 2);
if(gadget1.ng_Width < 10)
{
gadget1.ng_Width = 10;
}
gadget2.ng_LeftEdge = gadget1.ng_Width + gadget1.ng_LeftEdge + 5;
gadget2.ng_Height = gadget1.ng_Height;
gadget2.ng_Width = gadget1.ng_Width;
}
/* Muß hier Gadgets belegen und einbinden. */
int MakeGadgets(void)
{
int ret=FALSE;
if((vi=GetVisualInfoA(mywindow->WScreen,NULL)))
{
gadget1.ng_VisualInfo = vi;
gadget2.ng_VisualInfo = vi;
if((dummygg=CreateContext(&glistptr)))
{
if((gg1ptr=CreateGadgetA(LISTVIEW_KIND,dummygg,&gadget1,gg1tags)))
{
if((gg2ptr=CreateGadgetA(LISTVIEW_KIND,gg1ptr,&gadget2,gg2tags)))
{
ret=TRUE;
EraseRect(mywindow->RPort,mywindow->BorderLeft,mywindow->BorderTop,mywindow->Width-mywindow->BorderRight-1,mywindow->Height-mywindow->BorderBottom-1);
AddGList(mywindow,glistptr,-1,-1,0);
RefreshWindowFrame(mywindow);
GT_RefreshWindow(mywindow,0);
}
else
{
FreeGadgets(glistptr);
glistptr = NULL;
}
}
}
else
{
FreeVisualInfo(vi);
}
}
return(ret);
}
void RemoveGadgets(void)
{
if((glistptr))
{
RemoveGList(mywindow,glistptr,-1);
FreeGadgets(glistptr);
FreeVisualInfo(vi);
}
}
int MakeList(void)
{
struct FileInfoBlock *fib = NULL;
struct Node *node=NULL;
BPTR filehandle = NULL;
BYTE *buffer;
BYTE *tempptr;
UBYTE TrackNum = 1;
int ret = FALSE;
LONG pos=0;
if((fib=AllocDosObject(DOS_FIB,NULL)))
{
if((filehandle=Open((char *)Kommandoparameter[0],MODE_OLDFILE)))
{
if(DOSTRUE==ExamineFH(filehandle,fib))
{
if((buffer=LibAllocPooled(mempool,fib->fib_Size)))
{
Read(filehandle,buffer,fib->fib_Size);
/* Eigentliche Bearbeitung der Textdatei */
tempptr = buffer;
while(tempptr < buffer+fib->fib_Size) /* solange nicht über Ende hinaus*/
{
if((node=MakeNode((char *)tempptr)))
{
node->ln_Type = TrackNum; /* Mißbraucht um die Tracknummer zu sichern! */
TrackNum++;
AddTail((struct List *)&Header1,node);
}
for(;tempptr[0] != 0;tempptr++)
{
/* Nix! */
}
tempptr++;
}
ret=TRUE;
LibFreePooled(mempool,buffer,fib->fib_Size);
}
else
{
ShowMsg(NOMEM);
}
}
else
{
ShowMsg("Examine fehlgeschlagen.\n");
}
Close(filehandle);
}
else
{
ShowMsg("Konnte \"");
ShowMsg((char *)Kommandoparameter[0]);
ShowMsg("\" nicht öffnen!\n");
}
FreeDosObject(DOS_FIB,fib);
}
else
{
ShowMsg("Konnte FileInfoBlock nicht belegen!\n");
}
return(ret);
}
/* Erzeugt stinknormale Nodes (mit Name dahinter, natürlich! */
struct Node *MakeNode(char string[])
{
struct Node *mem;
if((mem=LibAllocPooled(mempool,sizeof(struct Node)+strlen(string)+1)))
{
mem->ln_Name=(char *)(mem+1);
strcpy((char *)(mem+1),string);
}
else
{
ShowMsg(NOMEM);
}
return(mem);
}
/* gibt nur ne Meldung aus ;) */
void ShowMsg(STRPTR msg)
{
PutStr(msg);
}